// From表单验证规则  可用于公用的校验部分
const city = {
  11: "北京",
  12: "天津",
  13: "河北",
  14: "山西",
  15: "内蒙古",
  21: "辽宁",
  22: "吉林",
  23: "黑龙江 ",
  31: "上海",
  32: "江苏",
  33: "浙江",
  34: "安徽",
  35: "福建",
  36: "江西",
  37: "山东",
  41: "河南",
  42: "湖北 ",
  43: "湖南",
  44: "广东",
  45: "广西",
  46: "海南",
  50: "重庆",
  51: "四川",
  52: "贵州",
  53: "云南",
  54: "西藏 ",
  61: "陕西",
  62: "甘肃",
  63: "青海",
  64: "宁夏",
  65: "新疆",
  71: "台湾",
  81: "香港",
  82: "澳门",
  91: "国外 ",
};
var FormValidate = (function () {
  function FormValidate() { }
  FormValidate.Form = function () {
    return {
      //字符串不能有特殊字符
      checkName: function (rule, value, callback) {
        if (!/^[0-9a-zA-Z\u4E00-\u9FA5]+$/.test(value))
          return callback(new Error("不能包含特殊字符和标点符号"));
        callback();
      },
      //手机号码
      checkAphone: function (rule, value, callback) {
        if (value) {
          // 10-29去掉区号-固话的判断
          if (
            !/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/.test(
              value
            )
          )
            return callback(new Error("请填写正确的联系方式"));
        }
        callback();
      },
      //来电电话
      checkformPhone: function (rule, value, callback) {
        if (value === "") {
          callback(new Error("请输入来电人电话"));
        } else {
          let regPone = null;
          let mobile = /^1(3|4|5|6|7|8|9)\d{9}$/; //最新16手机正则
          let tel = /^(0[0-9]{2,3}\-)([2-9][0-9]{4,7})+(\-[0-9]{1,4})?$/; //座机
          if (value.charAt(0) == 0) {
            regPone = tel;
          } else {
            regPone = mobile;
          }
          if (!regPone.test(value)) {
            return callback(
              new Error("请填写来电人电话(座机格式'区号-座机号码')")
            );
          }
          callback();
        }
      },
      //身份证
      checkApplyCard: function (rule, value, callback) {
        var value, Y, JYM;
        var S, M, ereg;
        var idcard_array = new Array();
        idcard_array = value.split("");
        //空格
        if (!/^[^\s]*$/.test(value)) {
          return callback(new Error("身份证号码不能含有空格"));
        }
        //地区检验
        if (city[parseInt(value.substr(0, 2))] == null) return callback(new Error("身份证号码地址编码错误"));
        //身份号码位数及格式检验
        switch (value.length) {
          case 15:
            if ((parseInt(value.substr(6, 2)) + 1900) % 4 == 0 || ((parseInt(value.substr(6, 2)) + 1900) % 100 == 0 && (parseInt(value.substr(6, 2)) + 1900) % 4 == 0)) {
              ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/; //测试出生日期的合法性
            } else {
              ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/; //测试出生日期的合法性
            }
            if (!ereg.test(value)) return callback(new Error("身份证出生日期超出范围或含有非法字符"));
            break;
          case 18:
            //18位身份号码检测
            //出生日期的合法性检查[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0-9][0-9])
            //闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
            //平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
            if (parseInt(value.substr(6, 4)) % 4 == 0 || (parseInt(value.substr(6, 4)) % 100 == 0 && parseInt(value.substr(6, 4)) % 4 == 0)) {
              ereg = /^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0][0-9]|[2][0][1][0-9]|[2][0][0-2][0-1])((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/; //闰年出生日期的合法性正则表达式
            } else {
              ereg = /^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0][0-9]|[2][0][1][0-9]|[2][0][0-2][0-1])((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/; //平年出生日期的合法性正则表达式
            }
            if (ereg.test(value)) { //测试出生日期的合法性
              //计算校验位
              S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7 + (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9 + (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10 + (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5 + (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8 + (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4 + (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2 + parseInt(idcard_array[7]) * 1 + parseInt(idcard_array[8]) * 6 + parseInt(idcard_array[9]) * 3;
              Y = S % 11;
              M = "F";
              JYM = "10X98765432";
              M = JYM.substr(Y, 1); //判断校验位
              let last = value.substr(value.length - 1, 1);
              if (last != 0) {
                if (!M == idcard_array[17]) return callback(new Error("身份证号码校验错误"));
              }
            } else return callback(new Error("身份证出生日期超出范围或含有非法字符"));
            break;
          default:
            return callback(new Error("身份证号码位数不对"));
            break;
        }
        callback();
      },
      //统一社会信用代码
      checkUnifiedCreditCode: function (rule, value, callback) {
        // 假如不是18位，错误
        if (!value || value.length !== 18) {
          return callback(new Error('统一社会信用代码长度不合法'));
        }
        var patrn = /^[0-9A-Z]+$/;
        //18位校验及大写校验
        if ((patrn.test(value) == false)) {
          return callback(new Error('信用代码英文字母必须全部大写并不能包含特殊字符'));
        }
        else {
          var Ancode;//统一社会信用代码的每一个值
          var Ancodevalue;//统一社会信用代码每一个值的权重
          var total = 0;
          var weightedfactors = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];//加权因子
          var str = '0123456789ABCDEFGHJKLMNPQRTUWXY';
          //不用I、O、S、V、Z
          for (var i = 0; i < value.length - 1; i++) {
            Ancode = value.substring(i, i + 1);
            Ancodevalue = str.indexOf(Ancode);
            total = total + Ancodevalue * weightedfactors[i];
            //权重与加权因子相乘之和
          }
          var logiccheckcode = 31 - total % 31;
          if (logiccheckcode == 31) {
            logiccheckcode = 0;
          }
          var Str = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,T,U,W,X,Y";
          var Array_Str = Str.split(',');
          logiccheckcode = Array_Str[logiccheckcode];
          var checkcode = value.substring(17, 18);
          if (logiccheckcode != checkcode) {
            return callback(new Error('请输入正确的统一社会信用代码'));
          }
          callback();
        }
      }
    }
  }

  // 用于个性化 特殊的校验
  FormValidate.FormMoney = function () {
    return {
      // 发放金额 保留两位小数点
      validateMoney: function (rule, value, callback) {
        let val = String(value);
        if (!val) {
          callback(new Error("发放金额不能为空"));
        } else if (val.indexOf(".") != -1 && val.split(".").length > 2) {
          callback(new Error("请输入正确格式的金额")); //防止输入多个小数点
        } else if (val.indexOf(".") != -1 && val.split(".")[1].length > 2) {
          callback(new Error("只保留两位小数，请输入正确的小数位数")); //小数点后两位
        } else {
          callback();
        }
      }
    }
  }

  return FormValidate
}())

exports.FormValidate = FormValidate
